home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
351-375
/
354
/
mxmlib
/
libinfo.prf
< prev
next >
Wrap
Text File
|
1995-03-14
|
24KB
|
853 lines
.define function
.lm 0
.ce 0
.bp 1
.he |mxm.library/$1||mxm.library/$1|
.fi
.ju
.en
.define note
.sp
.lm 3
$1 $2
.lm 7
.en
.define put
.sp
$1 $2 $3 $4 $5 $6 $7
.lm 7
.en
.define info
.lm 7
$1 -
.lm 11
.en
.define see
.sp
.lm 3
SEE ALSO
.lm 7
.nj
$1 $2 $3 $4 $5 $6 $7 $8 $9
.ju
.en
.define synopsis
.sp
.lm 3
SYNOPSIS
.lm 7
.nj
$1 $2 $3 $4 $5 $6 $7 $8 $9
.ju
.en
.function PURPOSE
.note BACKGROUND
mxm.library was created to support our in-house development
environment. It contains basic support functions as well as routines
frequently used but never to be found in any library. It seems strange
that most functions to be found in mxm.library will be included in
Kickstart 1.4. The contents of the library were put together from
various sources. You will find code derived from 'ancient' Developers'
kit sources, sample routines suggested on older public-domain disks as
well as new routines written by us. Many different areas of
programming are covered by mxm.library routines. Some routines check
gadgets while other deal with data encryption or produce sounds. All
in all we have tried to keep the library as small as possible and -
most important - reentrant.
.note CREDITS
The ikm.c source code was developed by Jimm Mackraz of
Commodore-Amiga, Inc., Los Gatos. AllocRem/FreeRem were created from
old EA IFF sources. PopMenu was extended from example source code by
Gambit Software. The Crc-16-bit checksumming routines were created by
Stephen Satchell and Chuck Forsberg.
.note CONTRIBUTIONS
If you are interested in adding new functions to mxm.library mail them
to us on disk. They will be included in the next library release.
.note ADDRESS
Olaf Barthel, MXM
.put Brabeckstrasse 35
.put D-3000 Hannover 71
.put Federal Republic of Germany
.function AllocRem
.note NAME
AllocRem - Allocate a chunk of memory
.synopsis MemoryBlock = AllocRem(Size,Requirements)
.note FUNCTION
Very similar to AllocMem, AllocRem allocates a chunk of memory, according to
size and type passed in arguments. The only difference is that the
size of the memory block being allocated is remembered.
.note INPUTS
.info Size
The number of bytes to allocate.
.info Requirements
Flags such as MEMF__CHIP, MEMF__FAST, MEMF__PUBLIC, MEMF__CLEAR.
.note RESULTS
.info MemoryBlock
A pointer to the allocated chunk of memory or NULL.
.note BUGS
.see exec.library/AllocMem, exec.library/FreeMem, mxm.library/AllocRem
.function FreeRem
.note NAME
FreeRem - Free a chunk of memory
.synopsis Pointer = FreeRem(MemoryBlock)
.note FUNCTION
FreeRem deallocates a block of memory previously allocated by
AllocRem. The size of the block does not need to specified since it is
stored in the first longword of the MemoryBlock. This function is
quite safe since NULL pointers are skipped.
.note INPUTS
.info MemoryBlock
Pointer to the chunk of memory to be allocated.
.note RESULTS
.info Pointer
This function always returns NULL, so user can do Pointer =
FreeRem(Pointer).
.note BUGS
FreeRem cannot be used to deallocate memory allocated via AllocMem.
.see exec.library/AllocMem, exec.library/FreeMem, mxm.library/FreeRem
.function CreateFuncTask
.note NAME
CreateFuncTask - Create a task
.synopsis Task = CreateFuncTask(TaskName,Priority,InitialPC,StackSize)
.note FUNCTION
CreateFuncTask creates a task from a given function and adds it to the
system list. The name of the task to be created does not need to be
statically initialized. It is copied into a separate chunk of memory
and gets freed by DeleteFuncTask().
.note INPUTS
.info TaskName
Pointer to null-terminated string.
.info Priority
The priority the task will be started from.
.info InitialPC
Pointer to function to be started as a task.
.info StackSize
The stack size you wish to execute the task with.
.note RESULTS
.info Task
Pointer to a Task-structure, or NULL.
.note BUGS
.see exec.library/AddTask
.function DeleteFuncTask
.note NAME
DeleteFuncTask - Delete a task
.synopsis Pointer = DeleteFuncTask(Task)
.note FUNCTION
DeleteFuncTask removes a Task from the system list previously created
with CreateFuncTask.
.note INPUTS
.info Task
Pointer to a Task-structure.
.note RESULTS
This function always returns NULL, so user can do Pointer =
DeleteFuncTask(Pointer).
.note BUGS
This function does not handle self-deletion properly.
.see mxm.library/CreateFuncTask
.function CreateFuncProc
.note NAME
CreateFuncProc - Create a process
.synopsis Proc = CreateFuncProc(ProcName,Priority,InitialPC,StackSize)
.note FUNCTION
CreateFuncProc creates a process from a given function and adds it to the
system list.
.note INPUTS
.info ProcName
Pointer to null-terminated string.
.info Priority
The priority the process will be started from.
.info InitialPC
Pointer to function to be started as a process.
.info StackSize
The stack size you wish to execute the process with.
.note RESULTS
.info Proc
Pointer to a Process-structure, or NULL.
.note BUGS
Currently this function can only be called from processes, since
DOS-routines are employed to install the new process.
.see exec.library/AddTask, mxm.library/CreateFuncTask
.function MovePointer
.note NAME
MovePointer - Move the mouse pointer to given position
.synopsis Success = MovePointer(Screen,Button,X,Y)
.note FUNCTION
MovePointer positions the mouse pointer at the given x/y position
relative to the top/leftedge of a screen. Optionally a mouse-click can
be simulated.
.note INPUTS
.info Screen
Pointer to a Screen-structure.
.info Button
Boolean, TRUE if you want a mouse-click to be simulated, FALSE if not.
.info X
New X-position for the mouse pointer.
.info Y
New Y-position for the mouse pointer.
.note RESULTS
.info Success
Boolean.
.note BUGS
.see
.function WriteConsole
.note NAME
WriteConsole - Write a string to a window.
.synopsis Success = WriteConsole(Window,String)
.note FUNCTION
This function behaves very much like a call to the ANSI-function
puts(). A string, which may include ANSI control codes, is printed
into a window.
.note INPUTS
.info Window
Pointer to a Window-structure.
.info String
Pointer to a null-terminated string.
.note RESULTS
.info Success
Boolean.
.note BUGS
.see ANSI puts() command
.function DeletePrinterSupport
.note NAME
DeletePrinterSupport - Deallocate a PrinterSupport request.
.synopsis Pointer = DeletePrinterSupport(Support)
.note FUNCTION
All necessary cleanups for the PrinterSupport functions are provided
with this function (allocated memory is freed, device actions stopped
and device driver is closed).
.note INPUTS
.info Support
Pointer to a PrinterSupport-structure.
.note RESULTS
This function always returns NULL, so user can do Pointer =
DeletePrinterSupport(Pointer).
.note BUGS
.see mxm.library/CreatePrinterSupport, mxm.library/StartPrinterDump,
mxm.library/StopPrinterDump
.function CreatePrinterSupport
.note NAME
CreatePrinterSupport - Allocate a PrinterSupport-structure and
prepare the unit driver for printing.
.synopsis Support = CreatePrinterSupport(RastPort,ViewPort,LeftEdge,TopEdge,Width,Height,Large)
.note FUNCTION
This function creates a Dump-Rastport request for the printer.device
and passes it back to the caller who has to start the dump by a call
to StartPrinterDump().
.note INPUTS
.info RastPort
Pointer to a RastPort-structure, area to be printed.
.info ViewPort
Pointer to a ViewPort-structure.
.info LeftEdge/TopEdge
Corner of area to start printing from.
.info Width/Height
Size of area to be printed.
.info Large
Set this to TRUE if you wish to have the area printed as large as
possible.
.note RESULTS
Support = Pointer to a PrinterSupport-structure, or NULL.
.note BUGS
.see printer.device/PRD_DUMPRPORT
.function StartPrinterDump
.note NAME
StartPrinterDump - Send a graphics dump to the printer.
.synopsis StartPrinterDump(Support,WaitUntilDone)
.note FUNCTION
A printer graphics dump following a call to CreatePrinterSupport is
executed.
.note INPUTS
.info Support
Pointer to a PrinterSupport-structure.
.info WaitUntilDone
TRUE if you want the request to be satisfied before this function
returns.
.note RESULTS
.note BUGS
.see mxm.library/CreatePrinterSupport, printer.device/PRD_DUMPRPORT
.function StopPrinterDump
.note NAME
StopPrinterDump - Stop a graphics dump being in progress.
.synopsis Success = StopPrinterDump(Support,WaitUntilDone)
.note FUNCTION
A printer graphics dump started with StartPrinterDump() can be stopped
with this function.
.note INPUTS
.info Support
Pointer to a PrinterSupport-structure.
.info WaitUntilDone
TRUE if you want this function to return after the AbortIO function
has been satisfied.
.note RESULTS
.info Success
Boolean, FALSE if printer graphics dump was not to be aborted.
.note BUGS
.see mxm.library/CreatePrinterSupport,
mxm.library/StartPrinterSupport, printer.device/PRD_DUMPRPORT
.function DeleteTimer
.note NAME
DeleteTimer - Delete a timer-request.
.synopsis DeleteTimer(TimeRequest)
.note FUNCTION
This function deallocates a timer.device request previously allocated
via CreateTimer.
.note INPUTS
.info TimeRequest
Pointer to a timerequest structure.
.note RESULTS
.note BUGS
.see
.function CreateTimer
.note NAME
CreateTimer - Create a timer-request
.synopsis TimeRequest = CreateTimer(Unit)
.note FUNCTION
A timer-request is created with this function, depending on the
requested device driver unit.
.note INPUTS
.info Unit
The unit to be opened, can be either UNIT_VBLANK or UNIT_MICROHZ.
.note RESULTS
.info TimeRequest
Pointer to a timerequest-structure, or NULL.
.note BUGS
.see
.function WaitForTimer
.note NAME
WaitForTimer - Wait a given period of time.
.synopsis WaitForTimer(TimeRequest,TimeVal)
.note FUNCTION
This function gets the timer.device to wait a period of time.
.note INPUTS
.info TimeRequest
Pointer to a timerequest-structure.
.info TimeVal
Pointer to a timeval-structure.
.note RESULTS
.note BUGS
.see
.function TimeDelay
.note NAME
TimeDelay - Wait a given period of time.
.synopsis TimeDelay(Seconds,Micros,Unit)
.note FUNCTION
This function gets the timer.device to wait a period of time.
.note INPUTS
.info Seconds
Seconds to wait.
.info Micros
Microseconds to wait.
.info Unit
The unit to be opened, can be either UNIT_VBLANK or UNIT_MICROHZ.
.note RESULTS
.note BUGS
.see
.function KeyConvert
.note NAME
KeyConvert - Convert a raw-key to an ANSI character.
.synopsis Character = KeyConvert(IntuiMesssage)
.note FUNCTION
This function converts the contents of an IntuiMessage raw-key event
according to the current keymap settings into a real ANSI-character.
.note INPUTS
.info IntuiMessage
Pointer to IntuiMessage-structure.
.note RESULTS
.info Character
ANSI character, or NULL.
.note BUGS
.see
.function InvertKey
.note NAME
InvertKey - Convert an ANSI character into an InputEvent.
.synopsis Event = InvertKey(Code,Event,Command,ExtraInfo)
.note FUNCTION
This function turns an ANSI character into an InputEvent structure
which can be used to feed it back into the stream of input events.
.note INPUTS
.info Code
ANSI character to be converted.
.info Event
Pointer to InputEvent-structure.
.info Command
A combination of the flags IK__BUILDLIST, IK__USEIKM, IK__USELIST or
IK__NOSPECIAL.
.info ExtraInfo
This flag should be set to zero.
.note RESULTS
.info Event
Pointer back to input argument, or NULL.
.note BUGS
.see
.function EraseGadget
.note NAME
EraseGadget - Clear the background of a gadget.
.synopsis EraseGadget(RastPort,Gadget,Colour)
.note FUNCTION
The imagery of gadget is erased with this function.
.note INPUTS
.info RastPort
Pointer to the RastPort-structure the gadget will be erased from.
.info Gadget
Pointer to a Gadget-structure.
.info Colour
The pen number to erase the Gadget imagery with.
.note RESULT
The gadget's imagery is erased.
.note BUGS
.see
.function RefreshGadget
.note NAME
RefreshGadget - Refresh a single Gadget.
.synopsis RefreshGadget(Gadget,Window)
.note FUNCTION
This function refreshes a single gadget, not the whole list.
.note INPUTS
.info Gadget
Pointer to a Gadget-structure.
.info Window
Pointer to a Window-structure.
.note RESULTS
The gaget's imagery gets redrawn.
.note BUGS
.see
.function GetLongInt
.note NAME
GetLongInt - Get a value from a long integer gadget.
.synopsis Value = GetLongInt(Gadget)
.note FUNCTION
This function returns the value currently displayed in a long integer
gadget.
.note INPUTS
.info Gadget
Pointer to a Gadget-structure.
.note RESULTS
.info Value
The long integer value.
.note BUGS
.see
.function SetLongInt
.note NAME
SetLongInt - Set the value of a long integer gadget.
.synopsis SetLongInt(Gadget,Val)
.note FUNCTION
This function sets the value to be displayed in a long integer gadget.
.note INPUTS
.info Gadget
Pointer to a Gadget-structure.
.info Val
Long integer value to be put into the gadget.
.note RESULTS
.note BUGS
The Gadget has to be refreshed to actually see the value displayed.
.see
.function GetGadgetString
.note NAME
GetGadgetString - Get a string from a string gadget.
.synopsis String = GetGadgetString(Gadget)
.note FUNCTION
This function returns a pointer to the ASCII-string buffer of a string
gadget.
.note INPUTS
.info Gadget
Pointer to a Gadget-structure.
.note RESULTS
.info String
Pointer to an unsigned char (UBYTE).
.note BUGS
.see
.function SetGadgetString
.note NAME
SetGadgetString - Set the string for a string gadget.
.synopsis SetGadgetString(Gadget,String)
.note FUNCTION
This function sets the string to be displayed in a string gadget.
.note INPUTS
.info Gadget
Pointer to a Gadget-structure.
.info String
Pointer to an unsigned char (UBYTE), i.e. String to be set.
.note RESULTS
.note BUGS
The Gadget has to be refreshed to actually see the string displayed.
.see
.function GetToggleGadget
.note NAME
GetToggleGadget - Get the state of a Bool-Gadget.
.synopsis State = GetToggleGadget(Gadget)
.note FUNCTION
This function returns the state of a Bool-Gadget which has the
TOGGLEGADGET flags set and can be selected/unselected.
.note INPUTS
.info Gadget
Pointer to a Gadget-structure.
.note RESULTS
.info State
Boolean value, TRUE if gadget is selected, false if otherwise.
.note BUGS
.see
.function SetToggleGadget
.note NAME
SetToggleGadget - Set the state of a Bool-Gadget.
.synopsis SetToggleGadget(Gadget,State)
.note FUNCTION
This function sets the select state of a Bool-Gadget which has the
TOGGLEGADGET flags set and can be selected/unselected.
.note INPUTS
.info Gadget
Pointer to a Gadget-structure.
.info State
Boolean, TRUE if gadget is to be selected, FALSE if otherwise.
.note RESULTS
.note BUGS
The Gadget has to be refreshed to actually see the state displayed.
.see
.function SetWaitPointer
.note NAME
SetWaitPointer - Change the pointer to a Zzz-Balloon.
.synopsis SetWaitPointer(Window)
.note FUNCTION
This function changes the mouse pointer of a window to the standard
Workbench-Balloon, indicating that the running task is busy.
.note INPUTS
.info Window
Pointer to a Window-structure.
.note RESULTS
The mouse pointer gets changed.
.note BUGS
.see
.function PopRequest
.note NAME
PopRequest - Display a pop-up-requester.
.synopsis Result = PopRequest(ParentWindow,TitleText,BodyText,PosText,NegText,Default,ExtraInfo)
.note FUNCTION
This function brings up a pop-up-requester which is automatically
centered under the mouse pointer. The requester can be answered via
keyboard, supported positive keys are: Y, J, V, C, R, Return; negative
keys are: N, Q, B, Escape. Having answered the requester the original
front screen is brought to the front again.
.note INPUTS
.info ParentWindow
Pointer to a Window structure in which you want the requester to
appear, may be NULL, so requester will appear on the Workbench screen.
.info TitleText
The title of the requester window, may be NULL, so "System Request:"
will be used.
.info BodyText
The text you want to be displayed inside the requester may include
ANSI-control sequences (boldface, italics, different colours, etc.)
.info PosText
Text for positive response Gadget, may be NULL in which case no positive
Gadget will be displayed.
.info NegText
Tetx for negative response Gadget, may be NULL in which case no
negative Gadget will be displayed. PosText & NegText being NULL,
NegText will default to "Okay".
.info Default
Boolean value indicating the default value expected from the
requester.
.info ExtraInfo
Pointer to a PopSupport structure.
.note RESULTS
.info Result
Boolean, depending on the gadget being selected.
.note BUGS
.see mxmbase.h/struct PopSupport
.function PopMenu
.note NAME
PopMenu - Display a pop-up-menu.
.synopsis Item = PopMenu(Menu,Window)
.note FUNCTION
This function displays a menu, very similar to the standard Intuition
menus, just under the mouse pointer.
.note INPUTS
.info Menu
Pointer to a Menu-structure.
.info Window
Pointer to a Window-structure.
.note RESULTS
The menu item selected, or -1 if no item was selected.
.note BUGS
PopMenu does not handle sub-items in the current release.
.see mxmbase.h
.function Announce
.note NAME
Announce - Produce an audible signal.
.synopsis Announce()
.note FUNCTION
Announce produces a sound, not a beep but a chime, on two stereo channels.
.note INPUTS
.note RESULTS
.note BUGS
.see
.function CheckSumCRC
.note NAME
CheckSumCRC - Calculate the 16-bit crc checksum for a memory block.
.synopsis CRC = CheckSumCRC(Mem,Size)
.note FUNCTION
This function uses the Satchell/Forsberg-crc-function to calculate the 16-bit checksum
for a memory block with given size.
.note INPUTS
.info Mem
Pointer to memory block to be checksummed.
.info Size
Size of the memory block to be checksummed.
.note RESULTS
.info CRC
The 16-bit crc value for the memory block.
.note BUGS
.see
.function CheckSumSimple
.note NAME
CheckSum - Calculate a simple checksum for a memory block.
.synopsis Check = CheckSum(Mem,Size)
.note FUNCTION
Similar to CheckSumCRC this function calculates a checksum for a memory
block with given size. The algorithm employed is simpler.
.note INPUTS
.info Mem
Pointer to memory block to be checksummed.
.info Size
Size of the memory block to be checksummed.
.note RESULTS
.info Check
The 32-bit checksum value for the memory block.
.note BUGS
.see mxm.library/CheckSumCRC
.function CryptBlock
.note NAME
CryptBlock - Encrypt/Decrypt a memory block.
.synopsis CryptBlock(Mem,Size,String)
.note FUNCTION
This function encrypts/decrypts a block of memory using a pseudo-random
number generator. The data is XOR encoded, so a double CryptBlock will
result in decryption of the memory block. Additionally a string can be used
as a second encryption key. The string is optional and can be left out.
.note INPUTS
.info Mem
Pointer to memory block to be checksummed.
.info Size
Size of the memory block to be checksummed.
.info String
Pointer to second encryption string, may be null.
.note RESULTS
.note BUGS
.see
.function IsASCII
.note NAME
IsASCII - Check if a character is a valid Amiga ASCII character.
.synopsis IsIt = IsASCII(Character)
.note FUNCTION
This function checks if a character belongs to the list of valid Amiga
ASCII characters. Unlike compiler macros the international character set
of the Amiga is considered.
.note INPUTS
.info Character
The character to be checked.
.note RESULTS
.info IsIt
Boolean, TRUE if Character is a valid Amiga ASCII character.
.note BUGS
.see toupper() macro
.function IsPrintable
.note NAME
IsPrintable - Check if a character is a printable Amiga ASCII character.
.synopsis IsIt = IsPrintable(Character)
.note FUNCTION
This function checks if a character produces a visible result if printed.
Unlike compiler macros the international character set of the Amiga is
considered.
.note INPUTS
.info Character
The character to be checked.
.note RESULTS
.info IsIt
Boolean, TRUE if Character is a valid Amiga ASCII
character.
.note BUGS
.see isprintable() macro
.function ToUpper
.note NAME
ToUpper - Change a character to upper case.
.synopsis NewCharacter = ToUpper(Character)
.note FUNCTION
This function turns a character into an upper case character. Unlike
compiler macros the international character set of the Amiga is considered.
.note INPUTS
.info Character
The character to be turned to upper case.
.note RESULTS
.info NewCharacter
The upper case equivalent to the input character.
.note BUGS
.see toupper() macro
.function UStrCmp
.note NAME
UStrCmp - Case insensitive strcmp().
.synopsis Difference = UStrCmp(Source,Target)
.note FUNCTION
This function does a strcmp(), character by character, and uses the
ToUpper() function to compare the characters. It also matches
lower/upper case international characters.
.note INPUTS
.info Source
Pointer to source string.
.info Target
Pointer to target string.
.note RESULTS
.info Difference
The Difference between the strings to be compared, 0 if no difference.
.note BUGS
.see mxm.library/ToUpper()
.function Random
.note NAME
Random - Generate a random value.
.synopsis Value = Random(MaxValue)
.note FUNCTION
Random returns a random value between 0 and MaxValue - 1. The random
seed is XORed with the current video beam position, so the random
value is guaranteed not to produce repeated sequences of pseudo-random
values.
.note INPUTS
.info MaxValue
The maximum value + 1 expected from this function.
.note RESULTS
.info Value
Random value.
.note BUGS
.see
.function FindFileWindow
.note NAME
FindFileWindow - Find the window associated with a FileHandle.
.synopsis Window = FindFileWindow(Handle)
.note FUNCTION
This function finds the Intuition window associated with a Console
FileHandle by passing the handler task a a request to identify its
volume node (i.e.: the Window).
.note INPUTS
.info Handle
BPTR to a FileHandle-structure.
.note RESULTS
.info Window
Pointer to a Window-structure.
.note BUGS
This function will produce garbage if used on non-console FileHandles.
.see
.function DeleteHiddenRPort
.note NAME
DeleteHiddenRPort - Delete a hidden RastPort created by
CreateHiddenRPort().
.synopsis Pointer = DeleteHiddenRPort(RastPort)
.note FUNCTION
This function deallocates a hidden RastPort previously created with
CreateHiddenRPort().
.note INPUTS
.info RastPort
Pointer to a RastPort-structure.
.note RESULTS
This function always returns NULL, so user can do Pointer =
DeleteHiddenRPort(Pointer).
.note BUGS
.see
.function CreateHiddenRPort
.note NAME
CreateHiddenRPort - Create a hidden RastPort.
.synopsis RastPort = CreateHiddenRPort(Width,Height,Depth)
.note FUNCTION
This function allocates a RastPort structure, a BitMap structure,
initializes them and adds the requested number of planes to the
BitMap. The planes are zeroed out before this function returns.
.note INPUTS
.info Width
Width of the RastPort.
.info Height
Height of the RastPort.
.info Depth
Depth of the RastPort.
.note RESULTS
.info RastPort
Pointer to a RastPort structure, or NULL.
.note BUGS
.see
.function EnableWindow
.note NAME
EnableWindow - Enable all gadgets of a window and restore the mouse
pointer.
.synopsis EnableWindow(Window)
.note FUNCTION
This function reenables the gadgets of a window previously disabled
with DisableWindow() and sets the standard system mouse pointer.
.note INPUTS
.info Window
The Window to be reenabled.
.note RESULTS
.note BUGS
Can only handle windows really disabled via DisableWindow(), may crash
on other windows.
.see mxm.library/DisableWindow()
.function DisableWindow
.note NAME
DisableWindow - Disable all gadgets of a window and set a Zzz mouse
pointer.
.synopsis Success = DisableWindow(Window)
.note FUNCTION
This function disables all custom gadgets to be found in the window
and sets a Zzz mouse pointer.
.note INPUTS
.info Window
Pointer to a Window-structure.
.note RESULTS
.info Success
Boolean, TRUE if window was disabled.
.note BUGS
You MUST not remove or add Gadgets to the window after it has been
disabled, or EnableWindow() will panic.
.see mxm.library/EnableWindow()